#include #define INF 1e7 using namespace std; int G[20][20]; int C[20971520]; int C2[20971520]; int rev[524288]; int dp1(int s, int bm, int n) { if (C[bm*n+s] != INF) return C[bm*n+s]; if (!bm) return G[s][0]; int bm2=bm, ans=INF, nxt, u; while (bm2) { nxt = bm2&-bm2; u = rev[nxt]; ans = min(ans, G[s][u]+dp1(u, bm^nxt, n)); bm2 -= nxt; } return (C[bm*n+s]=ans); } int dp2(int s, int bm, int n) { if (C2[bm*n+s] != INF) return C2[bm*n+s]; if (!bm) return G[s][n-1]; int bm2=bm, ans=INF, nxt, u; while (bm2) { nxt = bm2&-bm2; u = rev[nxt]; ans = min(ans, G[s][u]+dp2(u, bm^nxt, n)); bm2 -= nxt; } return (C2[bm*n+s]=ans); } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); int n, m, a, b, w, tc=0, ans, full, idx[20], ptr; for (int i = 0; i < 20; i++) rev[1<> n >> m) { // set up graph and dp for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) G[i][j] = INF; G[i][i] = 0; } for (int i = 0; i < (n<> a >> b >> w; G[a][b] = G[b][a] = w; } // floyd-warshall for (int k = 0; k < n; k++) { for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) G[i][j] = min(G[i][j], G[i][k]+G[k][j]); } } if (n == 3) { cout << "Case " << ++tc << ": " << 2*(G[0][1]+G[1][2]) << '\n'; } else { fill(begin(C), begin(C)+(n<